package middleware

import (
	"myapp/internal/model"
	"myapp/internal/service"

	"github.com/gogf/gf/v2/errors/gcode"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

type sMiddleware struct {
	LoginUrl string // 登录路由地址
}

func init() {
	service.RegisterMiddleware(New())
}

func New() *sMiddleware {
	return &sMiddleware{
		LoginUrl: "/login",
	}
}

// CORS allows Cross-origin resource sharing.
func (s *sMiddleware) CORS(r *ghttp.Request) {
	r.Response.CORSDefault()
	r.Middleware.Next()
}

// 使用jwt的上下文, 与CtxWS选择使用一个即可
func (s *sMiddleware) Ctx(r *ghttp.Request) {
	//1. 初始化自定义
	ctx := r.GetCtx()
	customCtx := &model.CustomContext{
		Session: r.Session,
		Data:    make(g.Map),
	}

	//2. 将token信息注入到自定义的上下文中
	tokenString := r.Request.Header.Get("X-Token")
	if tokenString == "" {
		tokenString = r.Request.Header.Get("Authorization")
	}

	claims, err := service.JwtToken().ParseToken(ctx, tokenString)
	if err == nil {
		customCtx.User = &model.CustomContextUser{
			Id:       claims.Id,
			UserName: claims.Username,
		}
	}

	// 加入到context中
	service.CustomContext().Init(r, customCtx)

	// 执行下一步请求逻辑
	r.Middleware.Next()

}

// 自定义上下文对象, 使用session
func (s *sMiddleware) CtxWS(r *ghttp.Request) {
	//1. 初始化自定义
	customCtx := &model.CustomContext{
		Session: r.Session,
		Data:    make(g.Map),
	}

	//2. 将token信息注入到自定义的上下文中
	if userEntity := service.Session().GetUser(r); userEntity != nil && userEntity.Id > 0 {
		customCtx.User = &model.CustomContextUser{
			Id:       userEntity.Id,
			UserName: userEntity.Username,
		}
	}

	// 加入到context中
	service.CustomContext().Init(r, customCtx)

	// 执行下一步请求逻辑
	r.Middleware.Next()

}

// 用户必须登录才能访问
func (s *sMiddleware) Auth(r *ghttp.Request) {
	ctxUser := service.CustomContext().GetContextUser(r.GetCtx())
	logined := ctxUser != nil && ctxUser.Id > 0
	if !logined {
		code := gcode.CodeNotAuthorized
		r.Response.WriteJsonExit(ghttp.DefaultHandlerResponse{
			Code:    code.Code(),
			Message: "未授权",
		})
	}
	r.Middleware.Next()
}

// 返回处理中间件
func (s *sMiddleware) ResponseHandler(r *ghttp.Request) {
	r.Middleware.Next()

	// // 如果已经有返回内容，那么该中间件什么也不做
	// if r.Response.BufferLength() > 0 {
	// 	return
	// }

	// var (
	// 	err             = r.GetError()
	// 	res             = r.GetHandlerResponse()
	// 	code gcode.Code = gcode.CodeOK
	// )
	// if err != nil {
	// 	code = gerror.Code(err)
	// 	if code == gcode.CodeNil {
	// 		code = gcode.CodeInternalError
	// 	}
	// 	if r.IsAjaxRequest() {
	// 		response.JsonExit(r, code.Code(), err.Error())
	// 	} else {
	// 		// @todo
	// 		// service.View().Render500(r.Context(), model.View{
	// 		// 	Error: err.Error(),
	// 		// })
	// 	}
	// } else {
	// 	if r.IsAjaxRequest() {
	// 		response.JsonExit(r, code.Code(), "", res)
	// 	} else {
	// 		// 什么都不做，业务API自行处理模板渲染的成功逻辑。
	// 	}
	// }
}
